﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>AutoHotkey Tutorial: Macro and Hotkey Creation</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link title="AutoHotkey Forum RSS" href="../forum/rss.php" type="application/rss+xml" rel="alternate">
<link href="css/default.css" type="text/css" rel="stylesheet">
<link media="print" href="css/print.css" type="text/css" rel="stylesheet">
  <style type="text/css">
<!--
.style1 {font-size: 133%; font-weight: bold}
-->
  </style>
</head>
<body>

<h1>指南和概述</h1>

<p>这个简短的介绍将帮助你马上开始编写你自己的宏和热键脚本。</p>
<h2>指南目录</h2>
<ul>
  <li class="style1"><a href="#Create">创建一个脚本</a></li>
  <li class="style1"><a href="#Launch">启动一个程序或文档</a></li>
  <li class="style1"><a href="#Send">发送键击和鼠标点击</a></li>
  <li class="style1"><a href="#Activate">激活与操纵窗口</a></li>
  <li class="style1"><a href="#Dialogs">从用户使用的 MsgBox, InputBox 等命令来获取输入的数据</a></li>
  <li class="style1"><a href="#Variables">使用变量和剪贴板</a></li>
  <li class="style1"><a href="#Loop">一遍遍地重复一系列动作</a></li>
  <li class="style1"><a href="#Files">操纵文件和文件夹</a></li>
  <li class="style1"><a href="#Overview">其他功能的概述</a></li>
</ul>

<h2><a name="Create"></a>创建一个脚本</h2>
<p>每个脚本都是一个包含命令的要被程序(AutoHotkey.exe)执行的纯文本文件。一个脚本也可能包含<a href="Hotkeys.htm">热键</a>和<a href="Hotstrings.htm">热字串</a>，甚至于全部由它们组成。不过，在没有热键和热字串时，一个脚本从它被启动时起，将从头至尾顺序地执行它的命令。</p>
<p>要创建一个新脚本：</p>
<ol>
  <li>打开 Windows 资源管理器并进入一个你选择的文件夹。</li>
  <li>拉下文件菜单并选择 新建 &gt;&gt; AutoHotkey Script (或 新建 &gt;&gt; 文本文档)。</li>
  <li>给文件键入一个名称，确保它以 <strong>.ahk</strong> 结尾。例如：Test.ahk</li>
  <li>鼠标右键点击此文件并选择 Edit Script。</li>
  <li>在一个新的空行，键入下述内容：<br>
#space::Run www.google.com </li>
</ol>
<p>符号 # 表示 Windows 键，因此 #space 意味着按住 Windows 键然后按下空格键来激活一个热键。符号 :: 意味着每次按下此热键时，随后的命令将会被执行，在此例中将转到 Google 网站。要试用此脚本，按下述内容继续操作：</p>
<ol>
  <li>保存并关闭此文件。</li>
  <li>在 Windows 资源管理器中，鼠标双击来启动脚本。一个新的系统托盘图标出现。</li>
  <li>按住 Windows 键并按下空格键。一个网页在默认浏览器中打开。</li>
  <li>要退出或编辑此脚本，鼠标右键点击它的系统托盘图标。</li>
</ol>
<p>注意：多个脚本能被同时运行，每个带有它自己的托盘图标。此外，每个脚本能拥有多个<a href="Hotkeys.htm">热键</a>和<a href="Hotstrings.htm">热字串</a>。</p>

<h2><a name="Launch"></a>启动一个程序或文档</h2>
<p><a href="commands/Run.htm">Run</a> 命令用来启动一个程序、文档、URL(统一资源定位符) 或者快捷方式。这里有一些普通的例子：</p>
<pre>Run Notepad<br>Run C:\My Documents\Address List.doc<br>Run C:\My Documents\My Shortcut.lnk<br>Run www.yahoo.com<br>Run mailto:someone@somedomain.com</pre>
<p>一个热键通过包含一个<a href="Hotkeys.htm">热键标记</a>能被分配给以上任何一个例子。在下面的第一个例子中，被分配的热键是 Win+N，而在第二个里是 Control+Alt+C：</p>
<pre>#n::Run Notepad<br>^!c::Run calc.exe</pre>
<p>上面的例子被称为单行热键，因为每个热键仅由单个命令组成。要通过一个热键执行多个命令，把首行放在热键定义的<u>下面</u>并让末行有一个 <em><a href="commands/Return.htm">return</a></em>。例如：</p>
<pre>#n::<br>Run http://www.google.com<br>Run Notepad.exe<br>return</pre>
<p>如果要运行的程序或文档没有与系统结合在一起，指定它的完整路径来使它启动：</p>
<pre>Run %A_ProgramFiles%\Winamp\Winamp.exe</pre>
<p>在上面的例子里，%A_ProgramFiles% 是一个<a href="Variables.htm#BuiltIn">内置变量</a>。通过使用它而不是类似像 <em>C:\Program Files</em>，脚本将更便携，意味着它将很有可能在其他计算机上运行。注意：命令的名称和变量都不区分大小写。例如，"Run" 和 "run" 是一样的，而且 "A_ProgramFiles" 也和 "a_programfiles" 是一样的。</p>
<p>要让脚本在继续执行前等待程序或文档关闭，使用 <a href="commands/Run.htm">RunWait</a> 代替 Run。在下述例子中，<a href="commands/MsgBox.htm">MsgBox</a> 命令将不会执行，直到用户关闭了记事本之后：</p>
<pre>RunWait Notepad<br>MsgBox 用户已完成(记事本已被关闭)。</pre>
<p>要学习更多关于启动程序的内容--像传递参数、指定工作目录和了解一个程序的退出代码--点击<a href="TutorialLaunch.htm">这里</a>。</p>

<h2><a name="Send"></a>发送键击和鼠标点击</h2>
<p>键击通过使用 <a href="commands/Send.htm">Send</a> 命令发送到活动的(最前面的)窗口。在下述例子中，Win+S 变为一个热键去键入一个签名(确保在按下 Win+S 前，像一个编辑器或起草电子邮件信息的窗口是活动的)：</p>
<pre>#s::<br>Send Sincerely,{Enter}John Smith<br>return</pre>
<p>在上面的例子里，所有的字符精确地发送，除了 {Enter}，其模拟按下了 Enter 键。下一个例子说明了其他一些常用的特殊字符：</p>
<pre>Send ^c!{tab}pasted:^v</pre>
<p>上面这行发送了一个 Control+C 紧跟一个 Alt+Tab 紧跟字串 "pasted:" 紧跟一个 Control+V。要得到一个完整的特殊字符和按键的列表，请见 <a href="commands/Send.htm">Send</a> 命令。</p>
<p>最后，键击也能对你键入的缩写做出反应而被发送，这称为<a href="Hotstrings.htm">热字串</a>。例如，每当你键入 Btw 紧跟一个空格或逗号，下述这行会把它替换为 "By the way"：</p>
<pre>::btw::by the way</pre>
<p><u><strong><br>
鼠标点击</strong></u>：要对一个窗口发送一个鼠标点击，首先必须要定义将要点击的位置的 X 和 Y 坐标轴。这个能用 AutoScriptWriter 或 Window Spy 来完成，它们已包含在 AutoHotkey 中。下述步骤是适用于 Window Spy 的方法：</p>
<ol>
  <li>从脚本的托盘图标菜单或系统开始菜单启动 Window Spy。</li>
  <li>通过鼠标点击感兴趣的窗口的标题栏、alt 标签栏或其他方法来激活窗口 (被设计好的 Window Spy 将处于 "置顶" )。</li>
  <li>在目标窗口中移动鼠标指针到想要的位置并记下由 Window Spy 显示的鼠标坐标轴 (或按下 Shift-Alt-Tab 来激活 Window Spy 以便 "冻结的" 坐标轴能被复制和粘贴)。</li>
  <li>在 <a href="commands/Click.htm">Click</a> 命令中使用上面发现的坐标轴。下述例子点击了鼠标左键：<br>
    <strong>Click 112, 223</strong></li>
</ol>
<p>要移动鼠标而不是点击，请用 <a href="commands/MouseMove.htm">MouseMove</a>。要拖选鼠标，请用 <a href="commands/MouseClickDrag.htm">MouseClickDrag</a>。</p>

<h2><a name="Activate"></a>激活与操纵窗口</h2>
<p>要激活一个窗口 (使它在最前面)，使用 <a href="commands/WinActivate.htm">WinActivate</a>。要探测一个窗口是否存在，使用 <a href="commands/IfWinExist.htm">IfWinExist</a> 或 <a href="commands/WinWait.htm">WinWait</a>。下述的例子阐明了这些命令：</p>
<pre>IfWinExist 无标题 - 记事本<br>{<br>    WinActivate<br>}<br>else<br>{<br>    Run Notepad<br>    WinWait 无标题 - 记事本<br>    WinActivate<br>}</pre>
<p>上面的例子首先搜索标题以"无标题 - 记事本" (区分大小写) 开始的任何存在的窗口。如果这样的一个窗口被找到，它将被激活。否则，记事本被启动并且脚本等待无标题窗口出现，那时它将被激活。上面的例子也运用了<a href="LastFoundWindow.htm">最近找到的窗口</a>来避免需要在每个 WinActivate 右边指定窗口的标题。</p>
<p>其他一些常用的窗口命令是：</p>
<ul>
  <li><a href="commands/IfWinActive.htm">IfWinActive</a>: 检查指定的窗口当前是否激活。</li>
  <li><a href="commands/WinWaitActive.htm">WinWaitActive</a>: 等待指定的窗口变为活动的窗口 (典型地使用在发送一个窗口激活键击之后，例如按下 Control-F 来&ldquo;查找&rdquo;)。</li>
  <li><a href="commands/WinClose.htm">WinClose</a>: 关闭指定的窗口。</li>
  <li><a href="commands/WinMove.htm">WinMove</a>: 移动及(或)调整指定窗口的大小。</li>
  <li><a href="commands/WinMinimize.htm">WinMinimize</a>, <a href="commands/WinMaximize.htm">WinMaximize</a>, <a href="commands/WinRestore.htm">WinRestore</a>: 分别最小化、最大化或还原指定的窗口。</li>
</ul>

<h2><a name="Dialogs"></a>从用户使用的 MsgBox, InputBox 等命令来获取输入的数据</h2>
<p>下述例子显示一个带两个按钮的对话框 (是 和 否)：</p>
<pre><a href="commands/MsgBox.htm">MsgBox</a>, 4, , 你想继续吗？<br><a href="commands/IfMsgBox.htm">IfMsgBox</a>, No<br>    return<br><em>;否则，用户选择了是。</em>
MsgBox 你按了是。</pre>

<p>使用 <a href="commands/InputBox.htm">InputBox</a> 命令来提示用户键入一个字串。使用 <a href="commands/FileSelectFile.htm">FileSelectFile</a> 或 <a href="commands/FileSelectFolder.htm">FileSelectFolder</a> 
来让用户选择一个文件或文件夹。为了更高级的任务，使用 <a href="commands/Gui.htm">Gui</a> 命令来创建自定义用户界面和数据输入表单。</p>
<p>提示：你也许已经从其他例子中注意到任何命令的第一个逗号可以被省略 (除了当第一个参数为空或者命令是单独在一个<a href="Scripts.htm#continuation">连续部分</a>的顶端) 。例如：</p>
<pre>MsgBox 这是可以的。<br>MsgBox<strong>,</strong> 这也是可以的 (它有一个明显的逗号)。</pre>

<h2><a name="Variables"></a>使用变量和剪贴板</h2>
<p>一个<strong>变量</strong>是脚本储存文本或数字的一个内存区域。尽管所有变量将它们的内容存为字符串，一个仅包含数位的变量会在一个数学运算或比较需要时，自动地转换为一个数字。相反地，当一个数学运算的结果需要被存进一个变量时会被转换回一个字串。</p>
<p>除了在<a href="Functions.htm#Locals">函数</a>里的局部变量外，所有变量都是全局的；就是说，它们的内容可以在脚本的任意部分被读取或更改。另外，变量不需要声明；它们只在使用它们时存在 (并且每个变量都以空或空白开始) 。</p>
<p>要指定一个字串给一个变量，参照这些例子：</p>
<pre>MyVar1 = 123<br>MyVar2 = 我的字串</pre>
要将一个变量的内容和一个数字或字串比较，参照这些例子：
<pre>if MyVar2 = 我的字串<br>{<br>    MsgBox MyVar2 包含字串"我的字串"。<br>}<br>if MyVar1 &gt;= 100<br>{<br>    MsgBox MyVar1 包含 %MyVar1%，它是一个大于或等于 100 的数字。<br>}</pre>
<p>在上面的 MsgBox 行， 注意那第二个出现的 <em>MyVar1</em> 被括在百分号内。它在那里显示了 <em>MyVar1</em> 的内容。相同的手法能用来复制一个变量的内容给另一个变量。例如：</p>
<pre>MyVarConcatenated = %MyVar1% %MyVar2%</pre>
<p>上面这行在变量 MyVarConcatenated 中储存了字串 "123 我的字串" (不含引号) 。</p>
<p>要比较一个变量和另一个变量的内容的用法，参考这个例子：</p>
<pre>if (ItemCount &gt; ItemLimit)<br>{<br>    MsgBox 在 ItemCount 里的值，是 %ItemCount%，比 %ItemLimit% 大。<br>}</pre>
<p>注意上面例子的首行包含圆括号。圆括号表示那 if-语句包含一个<a href="Variables.htm#Expressions">表达式</a>。没有它们的话，那行将被认作一个&ldquo;非表达式的 if-语句&rdquo;，并且因此它将需要让 ItemLimit 以百分号围住。这样的 IF 语句被限制为一个单独的比较运算符；也就是说，它们不能包含数学运算符或者像 "AND" 和 "OR" 这样的联合运算符。</p>
<p><u><strong><br>
数学</strong></u>: 要执行一个数学运算，使用冒号-等号运算符 (:=) 来指定一个<a href="Variables.htm#Expressions">表达式</a>的结果给一个变量， 像下面的例子：</p>
<p>NetPrice := Price * (1 - Discount/100)</p>
<p>请见<a href="Variables.htm#Expressions">表达式</a>来获得一个完整的数学运算符列表。</p>
<p><br>
<u><strong>剪贴板</strong></u>: 名为 <em>Clipboard</em> 的变量是特殊变量，因为它包含了当前 Windows 剪贴板里的文本。即使如此，它也能像一个普通变量被使用。例如，下面这行将显示当前剪贴板的内容：</p>
<pre>MsgBox %clipboard%</pre>
<p>要改变剪贴板内容，参考下述例子，它用新的文本替换了当前剪贴板里的内容：</p>
<pre>clipboard = 一行文本。`r`n第二行文本。`r`n</pre>
<p>在上面这行，`r 和 `n (重音符紧跟着字母 "r" 或 "n") 被用来标明两个特殊的字符：回车和换行。这两个字符重新开始一个文本行就像用户按下了 Enter 键。</p>
<p>要追加文本到剪贴板(或任何其他变量)，参照这个例子：<br>
clipboard = %clipboard% 这里是追加的文本。</p>
<p>详见<a href="misc/Clipboard.htm">剪贴板</a>和<a href="Variables.htm">变量</a>章节。</p>

<h2><a name="Loop"></a>一遍遍地重复一系列动作</h2>
<p>要连续地不止一次执行某物，一个 <a href="commands/Loop.htm">loop</a> 就是答案。下述 loop 显示了三次 <a href="commands/MsgBox.htm">MsgBox</a> ：</p>
<pre>Loop 3<br>{<br>    MsgBox 此窗口将被显示三次。<br>}</pre>
<p>你也能在单词 Loop 后面指定一个变量，它在脚本内部的某处其循环的次数被定义时是有用的：</p>
<pre>Loop %RunCount%<br>{<br>    Run C:\Check Server Status.exe<br>    Sleep 60000  <em>;暂停 60 秒。</em>
}</pre>
<p>在上面例子里，loop 将执行指定的次数，除非 RunCount 是 0，在这种情况下，loop 整个被跳过。</p>
<p>一个 loop 也可以终止它自己，当一个或多个条件改变时。下述例子重复地点击鼠标左键，当用户按住 F1 键时：</p>
<pre>$F1::  <em>;让 F1 键成为一个热键 ( $ 符号有助于下面 GetKeyState 的 "P" 模式)。</em>
Loop  <em>;由于没有指定数字给它，这是一个无限循环，除非在内部碰到 "break" 或 "return"。</em>
{
    if not GetKeyState("F1", "P")  <em>;如果此状态为真，则用户已经物理地释放了 F1 键。</em>
        break  <em>;打破循环。</em>
    <em>;否则 (由于上面没有"打破")，保持点击鼠标左键。</em>
    Click  <em>;在当前光标位置点击鼠标左键。</em>
}
return</pre>
<p>上面的例子和一个有时称为 "while...do" 的循环在功能上相同。短语 "while...do" 指的是<em>当</em>某个或某些条件仍然为真时，此循环重复地<em>做</em>某事的事实。在本例中，当 F1 键被按住的时候，此循环继续点击鼠标左键。当用户释放 F1 键时，此循环探测到此动作并通过 <a href="commands/Break.htm">break</a> 命令终止了它自己。<em>Break</em> 引起执行跳到循环的闭合大括号的下一行。</p>
<p>上面给出的例子是一般用途的循环。为了更具体的需要，可参考下述的某个循环：</p>
<p><a href="commands/LoopReadFile.htm">文件读写循环</a>: 在一个文本文件内一次检索一行。此命令能用来在一行行的基础上将一个文件转换成不同的格式。它也能被用来按你的标准逐行搜索。</p>
<p><a href="commands/LoopFile.htm">文件和文件夹循环</a>: 一次检索一个指定的文件或文件夹。它允许每个文件或文件夹执行一个满足你的标准的操作。</p>
<p><a href="commands/LoopParse.htm">分解循环</a>: 从一个字串里一次检索一个子字串。它允许一个像 "红、绿、蓝" 这样的字串被简单地打断成它的三个组成部分。</p>
<p><a href="commands/LoopReg.htm">注册表循环</a>: 一次检索一个指定的注册表子键的内容。</p>

<h2><a name="Files"></a>操纵文件和文件夹</h2>
<p>要添加文本到一个文件的末尾 (或创建一个新文件)，使用在下述例子里出现的 <a href="commands/FileAppend.htm">FileAppend</a>。注意它在后面使用 `n (换行) 来启用一个新的文本行：</p>
<pre>FileAppend, 添加一行文本。`n, C:\My Documents\My Text File.txt</pre>
<p>要覆盖一个存在的文件，在 FileAppend 之前使用 <a href="commands/FileDelete.htm">FileDelete</a>。例如：</p>
<pre>FileDelete, C:\My Documents\My Text File.txt</pre>
<p>其他一些常用的文件和文件夹命令是：</p>
<ul>
  <li><a href="commands/FileRead.htm">FileRead</a>: 读取一个文件的整个内容给一个变量。</li>
  <li><a href="commands/LoopReadFile.htm">文件读取循环</a>: 在一个文本文件里逐行检索。</li>
  <li><a href="commands/IfExist.htm">IfExist</a>: 根据一个文件或文件夹的是否存在而做出决定。</li>
  <li><a href="commands/FileSelectFile.htm">FileSelectFile</a> 和 <a href="commands/FileSelectFolder.htm">FileSelectFolder</a>: 为用户选择一个文件或文件夹显示一个对话框。</li>
  <li><a href="commands/FileDelete.htm">FileDelete</a>/<a href="commands/FileRecycle.htm">FileRecycle</a>: 删除或回收一个或多个文件。使用 <a href="commands/FileRemoveDir.htm">FileRemoveDir</a> 来删除一整个文件夹。</li>
  <li><a href="commands/FileCopy.htm">FileCopy</a>/<a href="commands/FileMove.htm">FileMove</a>: 复制或移动一个或多个文件。使用 <a href="commands/FileCopyDir.htm">FileCopyDir</a>/<a href="commands/FileMoveDir.htm">FileMoveDir</a> 来复制或移动一整个文件夹。</li>
  <li><a href="commands/LoopFile.htm">文件和文件夹循环</a>: 一次检索一个被包含在一个文件夹下的文件和文件夹。</li>
  <li><a href="commands/FileSetAttrib.htm">FileSetAttrib</a> 和 <a href="commands/FileSetTime.htm">FileSetTime</a>: 改变一个或多个文件的属性或时间标记。</li>
  <li><a href="commands/IniRead.htm">IniRead</a>, <a href="commands/IniWrite.htm">IniWrite</a> 和 <a href="commands/IniDelete.htm">IniDelete</a>: 创建、访问和修改标准格式的 INI 文件。</li>
  <li><a href="commands/RegRead.htm">RegRead</a>, <a href="commands/RegWrite.htm">RegWrite</a>, <a href="commands/RegDelete.htm">RegDelete</a> 和 <a href="commands/LoopReg.htm">Registry Loop</a>: 和 Windows 注册表一起工作。</li>
</ul>

<h2><a name="Overview"></a>其他功能的概述</h2>
<p>获取每个命令的概述，请见<a href="commands/index.htm">命令列表</a>。</p>

</body>
</html>
